// AGENTE QUE CONTROLA EL FUNCIONAMIENTO DE LA CASA SEG�N LA INFORMACI�N
// QUE RECIBE DEL AGENTE SENSORES

package Correojadess;

import jade.core.Agent;
import jade.core.behaviours.*;

import java.io.*;

import jade.lang.acl.ACLMessage;

import java.util.Iterator;
import java.util.StringTokenizer;

import java.lang.String;

import jess.*;

public class Controlador extends Agent{
	
	protected void setup(){
		
		addBehaviour(new controlJess());
		
	}
	
	// Este comportamiento es el que va a usar JESS.
	class controlJess extends OneShotBehaviour {
		
		// LLAMAR A JAVAMAIL
		
		
		
    	// Declaraci�n de los hechos actuales.
    	
    	private String analisis = "no_hecho";
    	private String preanalisis = "no_hecho";
		private String correo = "correo no_leido";
		private String asunto = "asunto no_leido";
		private String remitente = "remitente no_leido";
		private String contenido = "contenido no_leido";
    
    	
    	public void action() {
    		    	
    		// Declara el motor de JESS.
	    	Rete jess = new Rete();
	    	
	    	// Analiza que el archivo JESS sea correcto.
	    	try{
		    	FileReader file = new FileReader("src/Correojadess/correoInteligente.clp");
		    	try {
		    	     Jesp parser = new Jesp(file, jess);
				     parser.parse(false);
				 } catch (jess.JessException je) {
		                 	je.printStackTrace();
		                }
				  finally {
				     file.close();
				 }
				 }catch(IOException e) {
	             	System.err.println("Error!! No se ha podido acceder al archivo.");
             }
             
            // Carga el archivo JESS.
	    	
	    	try {
        		jess.reset();
        		jess.batch("src/Correojadess/correoInteligente.clp");
        		
        		// Inicializa los hechos.
        		
        		jess.eval("(assert (correo leido))");


				// Muestra los hechos iniciales.
				
	            Iterator it = jess.listFacts();
				while(it.hasNext()){
					System.out.println(it.next());	
				}
				
		    } catch (JessException ex) {
		        System.err.println(ex);
		    }
		    
	    	
    		// Sensores env�a constantemente la informaci�n que recibe.
    		// Este bucle comprueba si trae informaci�n distinta a la que se 
    		// tiene actualmente para aplicarla sobre JESS.
			
	    	while(true){
	    		
	    		
	    		
	    		
				try{
					// La informaci�n recibida del agente Sensores viene a trav�s
					// de un mensaje ACL.
					ACLMessage msg=myAgent.receive();
	            	if(msg!=null) {
			        	String contenido=msg.getContent();
			        	
			        	// Si la tiempo aumenta o disminuye se llama a la funci�n correspondiente.
			            if (contenido.equals("subir tiempo")){ 
			            	//jess.eval("(-- ?*tiempo*)");
			            	jess.eval("(subiendo)");
			            }
			        	else if (contenido.equals("bajar tiempo")){ 
			        			//jess.eval("(++ ?*tiempo*)");
			        			jess.eval("(bajando)");
			        		}

			        		//else {
			        			
					    		StringTokenizer st = new StringTokenizer(contenido);
					    		String var = st.nextToken();
					    		
					    		StringTokenizer st2 = new StringTokenizer(correo);
					    		String var2 = st2.nextToken();
					    		correo = "correo no_leido";
					    		
					    		//if(var2.equals(var)){
					    			if(correo.equals("correo no_leido")){
					    					
				        				jess.eval("(retract-string \"(" + correo + ")\")");
					    				jess.eval("(assert (" + contenido + "))");
					    				correo = contenido;	
					    				System.out.println(contenido);
					    				

					    				jess.eval("(assert (correo no_leido))");
					            		jess.eval("(assert (preanalisis no_hecho))");
					            		jess.eval("(assert (analisis no_hecho))");
					            		jess.eval("(assert (asunto no_leido))");
					            		jess.eval("(assert (remitente no_leido))");
					            		jess.eval("(assert (contenido no_leido))");
					    				
					    				}
					    					
					    			//}		
					    		
					    			
					    		jess.run();
					    		
					    		
					    		Iterator it = jess.listFacts();
								while(it.hasNext()){
									
									String msj=it.next().toString();
									
									if (msj.equals("(MAIN::p_claves_asun por_verificar_dt)")){
										System.out.println(msj);
										System.out.println("Extrayendo Palabras Clave del Asunto...");
										System.out.println("Verificando Si las Palabras Clave del Asunto estan en el Diccionario de Telefonia...");
										
										jess.eval("(retract-string \"(p_claves_asun por_verificar_dt)\")");
										//JAVAMAIL DEBERIA RESPONDER:
										//jess.eval("(assert (p_claves_asun existentes_dt))");
										//System.out.println("Palabras Clave Verificadas. Existen en el Diccionario de Telefonia");
										//o System.out.println("Palabras Clave Verificadas. NO existen en el Diccionario de Telefonia");
										
									}
								
									
								}
	            				}
	            				jess.run();	

			        		}
				

						
			       
				
			//}
			catch (JessException ex) {
		        System.err.println(ex);
		    }	
			}
		
	
    	}
    	
	}
}